home *** CD-ROM | disk | FTP | other *** search
/ Microsoft Multimedia Viewer How-To CD / Microsoft Multimedia Viewer How-To CD.iso / mvsample / progsamp / katasrch / mvbtask.c < prev    next >
C/C++ Source or Header  |  1993-03-21  |  5KB  |  183 lines

  1. /*************************************************************************
  2.  * MVBTASK.C
  3.  *
  4.  * This module provides a generic set of task-management routines for
  5.  * Viewer DLLs that need to keep track of unique session-specific data
  6.  * for each Viewer instance using the DLL. The module stores a table of
  7.  * VWRINFO data structures indexed by a task handle or instance handle,
  8.  * whichever is appropriate for the DLL. Functions are provided to
  9.  * initialize the table, add a VWRINFO structure for a new Viewer session,
  10.  * remove a VWRINFO structure for a session being closed, and retrieve
  11.  * a VWRINFO structure given a task handle or instance handle.
  12.  *
  13.  * To use this module, define a VWRINFO structure (including a far
  14.  * pointer to that structure, LPVWRINFO) in a header file for your DLL,
  15.  * then include that header file in this module. The functions provided
  16.  * by the module are:
  17.  *
  18.  * InitTasks:  Initializes the table. Call from LibMain.
  19.  *
  20.  * AddTask:    Allocates a new VWRINFO structure, adds the structure to the
  21.  *             table, and returns a pointer to that structure. Call from
  22.  *             LDLLHandler when you receive the DW_INIT message.
  23.  *
  24.  * DeleteTask: Given a task handle or instance handle, deletes the VWRINFO
  25.  *             structure for that task. Call from LDLLHandler when you
  26.  *             receive the DW_TERM message.
  27.  *
  28.  * GetTaskData: Given a task handle or instance handle, returns a pointer
  29.  *             to the VWRINFO structure for that task.
  30.  *
  31.  *************************************************************************/
  32.  
  33. #include <windows.h>
  34. #include <windowsx.h>
  35. #include <viewer.h>
  36. #include <stdlib.h>
  37.  
  38. // Replace the following line with #include "yourdll.h"
  39. #include "katasrch.h"
  40.  
  41. #include "mvbtask.h"
  42.  
  43. char szTaskTableFullMsg[] = "Can't add any more instances to the task table.";
  44. char szMVBTASK[] = "MVBTASK";
  45.  
  46. int nTasks;
  47.  
  48. VWRTASK amvbTasks[MAX_TASKS];
  49.  
  50.  
  51. /*************************************************************************
  52.  * InitTasks
  53.  *
  54.  * Initializes the task information table by setting all values to NULL.
  55.  *
  56.  *************************************************************************/
  57.  
  58. void InitTasks(void)
  59. {
  60.     int i;
  61.  
  62.     for(i = 0; i < MAX_TASKS; i++)
  63.     {
  64.         amvbTasks[i].hTask = NULL;
  65.         amvbTasks[i].lpData = NULL;
  66.     }
  67.     nTasks = 0;
  68. }
  69.  
  70.  
  71. /*************************************************************************
  72.  * GetTask
  73.  *
  74.  * Given a task handle or instance handle, returns the index of that
  75.  * table entry. Note: call this with a NULL handle to get the first
  76.  * empty entry.
  77.  *
  78.  * Returns: index to first matching entry, or -1 if no entry exists.
  79.  *
  80.  *************************************************************************/
  81.  
  82. int GetTask(HANDLE hTask)
  83. {
  84.     int i;
  85.     
  86.     for(i = 0; i < MAX_TASKS; i++)
  87.     {
  88.         if(amvbTasks[i].hTask == hTask)
  89.             return i;
  90.     }
  91.     return -1;
  92. }
  93.  
  94.  
  95. /*************************************************************************
  96.  * DeleteTask
  97.  *
  98.  * Given a task handle or instance handle, removes that entry from the
  99.  * table.
  100.  *
  101.  *************************************************************************/
  102.  
  103. void DeleteTask(HANDLE hTask)
  104. {
  105.     int i = GetTask(hTask);
  106.  
  107.     if(i == -1)
  108.     {
  109.         return;
  110.     }
  111.  
  112.     if(amvbTasks[i].lpData)
  113.     {
  114.         GlobalFreePtr(amvbTasks[i].lpData);
  115.  
  116.         amvbTasks[i].lpData = NULL;
  117.     }
  118.  
  119.     amvbTasks[i].hTask = NULL;
  120.  
  121.     nTasks--;
  122. }
  123.  
  124.  
  125.  
  126. /*************************************************************************
  127.  * GetTaskData
  128.  *
  129.  * Given a task handle or instance handle, returns a pointer to the
  130.  * session-information structure for that Viewer instance.
  131.  *
  132.  * Returns: Pointer to VWRINFO structure or NULL if no such entry exists.
  133.  *
  134.  *************************************************************************/
  135.  
  136. LPVWRINFO GetTaskData(HANDLE hTask)
  137. {
  138.     int i = GetTask(hTask);
  139.  
  140.     if(i == -1)
  141.         return NULL;
  142.     else
  143.         return amvbTasks[i].lpData;
  144. }
  145.  
  146.  
  147.  
  148. /*************************************************************************
  149.  * AddTask
  150.  *
  151.  * Given a task handle or instance handle, creates a new table entry
  152.  * for that Viewer session, including allocating the VWRINFO structure.
  153.  * The structure is allocated GMEM_ZEROINIT.
  154.  *
  155.  * Returns: Pointer to new VWRINFO structure or NULL if table is full or
  156.  *          memory allocation error occurs.
  157.  *
  158.  *************************************************************************/
  159.  
  160. LPVWRINFO AddTask(HANDLE hTask)
  161. {
  162.     // Get the first empty entry in the table.
  163.  
  164.     int i = GetTask(NULL);
  165.  
  166.     // Return error if table is already full.
  167.  
  168.     if(i == -1)
  169.         return NULL;
  170.  
  171.     amvbTasks[i].lpData = (LPVWRINFO)GlobalAllocPtr(
  172.                                         GMEM_MOVEABLE | GMEM_ZEROINIT, 
  173.                                         sizeof(VWRINFO));
  174.     if(amvbTasks[i].lpData)
  175.     {
  176.         amvbTasks[i].hTask = hTask;
  177.         nTasks++;
  178.     }
  179.  
  180.     return amvbTasks[i].lpData;
  181. }
  182.  
  183.